﻿
TypingText = function (element, interval, cursor, finishedCallback) {

    if ((typeof document.getElementById == "undefined") || (typeof element.innerHTML == "undefined")) {
        this.running = true; // Never run.
        return;
    }

    this.element = element;
    this.finishedCallback = (finishedCallback ? finishedCallback : function () { return; });
    this.interval = (typeof interval == "undefined" ? 10 : interval);
    this.origText = this.element.innerHTML;
    this.TypTime;
    this.unparsedOrigText = this.origText;
    this.cursor = (cursor ? cursor : "");
    this.currentText = "";
    this.currentChar = 0;
    this.element.typingText = this;
    if (this.element.id == "") this.element.id = "typingtext" + TypingText.currentIndex++;
    TypingText.all.push(this);

    this.running = false;
    this.inTag = false;
    this.tagBuffer = "";
    this.inHTMLEntity = false;
    this.HTMLEntityBuffer = "";
}
TypingText.all = new Array();
TypingText.currentIndex = 0;
TypingText.runAll = function () {
    for (var i = 0; i < TypingText.all.length; i++) TypingText.all[i].run();
    alert(TypingText.all[i].running);
}
TypingText.prototype.run = function () {
    if (this.running) return;
    if (typeof this.origText == "undefined") {

        this.Typtime = setTimeout("document.getElementById('" + this.element.id + "').typingText.run()", this.interval); // We haven't finished loading yet.  Have patience.
        return;
    }
    if (this.currentText == "") this.element.innerHTML = "";
    //  this.origText = this.origText.replace(/<([^<])*>/, "");     // Strip HTML from text.
    if (this.currentChar < this.origText.length) {
        if (this.origText.charAt(this.currentChar) == "<" && !this.inTag) {
            this.tagBuffer = "<";
            this.inTag = true;
            this.currentChar++;
            this.run();
            return;
        } else if (this.origText.charAt(this.currentChar) == ">" && this.inTag) {
            this.tagBuffer += ">";
            this.inTag = false;
            this.currentText += this.tagBuffer;
            this.currentChar++;
            this.run();
            return;
        } else if (this.inTag) {
            this.tagBuffer += this.origText.charAt(this.currentChar);
            this.currentChar++;
            this.run();
            return;
        } else if (this.origText.charAt(this.currentChar) == "&" && !this.inHTMLEntity) {
            this.HTMLEntityBuffer = "&";
            this.inHTMLEntity = true;
            this.currentChar++;
            this.run();
            return;
        } else if (this.origText.charAt(this.currentChar) == ";" && this.inHTMLEntity) {
            this.HTMLEntityBuffer += ";";
            this.inHTMLEntity = false;
            this.currentText += this.HTMLEntityBuffer;
            this.currentChar++;
            this.run();
            return;
        } else if (this.inHTMLEntity) {
            this.HTMLEntityBuffer += this.origText.charAt(this.currentChar);
            this.currentChar++;
            this.run();
            return;
        } else {
            this.currentText += this.origText.charAt(this.currentChar);
        }
        this.element.innerHTML = this.currentText;
        this.element.innerHTML += (this.currentChar < this.origText.length - 1 ? (typeof this.cursor == "function" ? this.cursor(this.currentText) : this.cursor) : "");
        this.currentChar++;

        this.Typtime = setTimeout("document.getElementById('" + this.element.id + "').typingText.run()", this.interval);
    } else {
        clearTimeout(this.Typtime);
        this.currentText = "";
        this.currentChar = 0;
        this.running = false;
        this.finishedCallback();
    }
}